import requests
import json as jsonp
from LogHandler import logger


class Request(object):
    """http请求工具类"""
    # 实例化session管理器，维持会话, 跨请求的时候保存参数
    session = requests.session()

    def __init__(self):
        self.logger = logger

    def send(self, method, url, params=None, data=None, json=None, headers=None, **kwargs):
        """
        :param method: http请求方式
        :param url: 请求地址
        :param params: 字典或bytes，作为参数增加到url中
        :param data: data类型传参，字典、字节序列或文件对象，作为Request的内容
        :param json: json传参，作为Request的内容
        :param headers: 请求头，字典
        :param kwargs: 若还有其他的参数，使用可变参数字典形式进行传递
        :return:
        """
        # 对异常进行捕获
        try:
            self.logger.info(f"请求方法：{method}")
            self.logger.info(f"请求地址：{url}")
            if headers:
                if not isinstance(headers, dict):
                    headers = jsonp.loads(headers)
                self.logger.info(f"请求头：{headers}")
            if params:
                if not isinstance(params, dict):
                    params = jsonp.loads(params)
                self.logger.info(f"查询参数：params={params}")
            if data:
                if not isinstance(data, dict):
                    data = jsonp.loads(data)
                self.logger.info(f"请求体：data={data}")
            if json:
                if not isinstance(json, dict):
                    json = jsonp.loads(json)
                self.logger.info(f"请求体：json={json}")
            if kwargs:
                self.logger.info(f"额外参数：kwargs={kwargs}")
            response = self.session.request(method, url, params=params, data=data, json=json,
                                            headers=headers, **kwargs)
            self.logger.info(f"响应状态码：{response.status_code}")
            self.logger.info(f"响应头：{response.headers}")
            if "json" in response.headers.get('Content-Type'):
                self.logger.info(f"响应体[json]：{response.json()}")
                return response
            elif "text" in response.headers.get('Content-Type'):
                self.logger.info(f"响应体[纯文本]：{response.text}")
                return response
            else:
                self.logger.info(f"响应体[二进制]：{response.content}")
                return response
        except Exception as e:
            # 异常处理 报错在日志中打印具体信息
            self.logger.error(f"请求失败：{e}")
